package cn.buddha.jesj.jvm;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName JvmTest
 * @Author 友野浩二
 * @Date 2020/5/22 10:13
 * @Description jvm测试
 * @Version 1.0
 */
public class JvmTest {

    public static void main(String[] args) {
        // java堆溢出
        heapOutOfMemoryError();
        // 递归调用导致 StackOverflowError
//        stackOverFlowError();
    }

    /**
     * <pre>
     *     要解决这个异常，一般先通过内存映像分析工具对堆转储快照分析，确定内存的对象是否是必要的，即判断是 内存泄露 还是 内存溢出。
     * </pre>
     *
     * @Author 友野浩二
     * @Description // 堆内存溢出测试
     * @Date 2020/5/22 10:40
     * @Param []
     */
    public static void heapOutOfMemoryError() {
        // 持有"大对象"的引用，防止垃圾回收
        List list = new ArrayList<>();
        while (true) {
            // 不断创建"大对象"
            // 这一行最终会出现 java.lang.OutOfMemoryError: Java heap space
            int[] tmp = new int[100000000];
            list.add(tmp);
        }
    }

    // 递归调用导致 StackOverflowError
    public static void stackOverFlowError() {
        // java.lang.StackOverflowError
        stackOverFlowError();
    }

}
